import pandas as pd
import numpy as np
from scipy.stats import zscore

# 参数配置
input_file = "Training_Samples.xlsx"  # 输入文件名
output_file = "output.xlsx"  # 输出文件名
z_threshold = 3  # Z分数阈值
class_list = [1, 2, 4, 5, 6, 7]  # 需要处理的类别列表

# 读取数据
df = pd.read_excel(input_file)

# 获取数值型列（排除类别列和非数值列）
numerical_cols = df.select_dtypes(include=[np.number]).columns.tolist()
numerical_cols.remove("CLASS")

# 按类别处理异常值
filtered_dfs = []
for class_val in class_list:
    class_data = df[df["CLASS"] == class_val].copy()
    print(class_val)
    if len(class_data) == 0:
        continue

    # 计算Z分数
    z_scores = class_data[numerical_cols].apply(zscore)

    # 标记异常样本（任意特征超出阈值即视为异常）
    outliers_mask = (z_scores.abs() > z_threshold).any(axis=1)

    # 保留正常样本
    filtered_class = class_data[~outliers_mask]
    filtered_dfs.append(filtered_class)

# 合并结果并导出
if filtered_dfs:
    result = pd.concat(filtered_dfs, ignore_index=True)
    result.to_excel(output_file, index=False)
    print(f"处理完成，保留样本数：{len(result)}，原始样本数：{len(df)}")
else:
    print("未找到有效数据")